package com.zxl.designpattern.behavioral.iterator;

import java.util.Iterator;

/**
 * 自定义集合类，这里就不自定义聚合接口了，直接实现Iterable接口。
 * 可以使用for-each循环遍历
 */

public class MyCollection implements Iterable {

    private static final int MAX_SIZE = 10;  // 集合最大容量
    private Object[] items;                  // 存储元素的数组
    private int size;                        // 当前元素数量
    
    /**
     * 构造函数，初始化集合
     */
    public MyCollection() {
        items = new Object[MAX_SIZE];
        size = 0;
    }
    
    /**
     * 添加元素到集合
     * @param item 要添加的元素
     */
    public void addItem(Object item) {
        if (size < MAX_SIZE) {
            items[size++] = item;
        } else {
            System.out.println("集合已满，无法添加更多元素");
        }
    }
    
    /**
     * 创建迭代器
     * @return 迭代器对象
     */
    public ICustomIterator createIterator() {
        return new MyIterator(items, size);
    }
    
    /**
     * 获取集合大小
     * @return 集合中元素的数量
     */
    public int size() {
        return size;
    }
    
    /**
     * 获取指定位置的元素
     * @param index 元素索引
     * @return 指定位置的元素
     */
    public Object get(int index) {
        if (index < 0 || index >= size) {
            throw new IndexOutOfBoundsException("索引超出范围");
        }
        return items[index];
    }

    // 实现Iterable接口的方法
    @Override
    public Iterator iterator() {
        return new JdkIteratorAdapter(createIterator());
    }

    /**
     * Java迭代器适配器，将自定义迭代器适配为Java标准迭代器。从而实现for-each循环的支持。
     */
    private static class JdkIteratorAdapter implements Iterator {

        // 自定义迭代器
        private ICustomIterator iterator;

        public JdkIteratorAdapter(ICustomIterator iterator) {
            this.iterator = iterator;
        }

        @Override
        public boolean hasNext() {
            return iterator.hasNext();
        }

        @Override
        public Object next() {
            return iterator.next();
        }

        @Override
        public void remove() {
            throw new UnsupportedOperationException("不支持移除操作");
        }
    }
}    